In [1]:
# import libraries

import os
from PIL import Image
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import random
In [ ]:
# Set random seed
np.random.seed(42)

Place Pokemon PNG Files on a Randomly Selected Natural Background¶

In [2]:
POKE_DIR       = r"pokemon_png"
BG_DIR         = r"backgrounds"
OUT_DIR        = r"pokemon_bg"
NUM_BGS        = 1824        # only use the first 1824 backgrounds
FLIP_PROB      = 0.5         # probability of horizontal flip
POKE_SCALE_MIN = 0.10        # 10% of bg width
POKE_SCALE_MAX = 0.40        # 40% of bg width

def main():
    # Gather file lists
    poke_files = sorted([f for f in os.listdir(POKE_DIR)
                         if f.lower().endswith('.png')])
    bg_files   = sorted([f for f in os.listdir(BG_DIR)
                         if f.lower().endswith(('.jpg','jpeg'))])[:NUM_BGS]

    if not poke_files:
        raise RuntimeError("No Pokémon PNGs found in pokemon_png/")
    if not bg_files:
        raise RuntimeError("No background JPGs found in backgrounds/")

    # Prepare output directory
    os.makedirs(OUT_DIR, exist_ok=True)

    total = len(poke_files)
    for i, poke_name in enumerate(poke_files, start=1):
        # Load the Pokémon sprite (with alpha)
        poke_path = os.path.join(POKE_DIR, poke_name)
        poke = Image.open(poke_path).convert("RGBA")

        # Random horizontal flip
        if random.random() < FLIP_PROB:
            poke = poke.transpose(Image.FLIP_LEFT_RIGHT)

        # Pick & load a random background
        bg_name = random.choice(bg_files)
        bg_path = os.path.join(BG_DIR, bg_name)
        bg = Image.open(bg_path).convert("RGBA")
        bg_w, bg_h = bg.size

        # Random scale
        scale = random.uniform(POKE_SCALE_MIN, POKE_SCALE_MAX)
        new_w = int(bg_w * scale)
        # Keep aspect ratio
        w0, h0 = poke.size
        new_h = int(h0 * (new_w / w0))
        poke = poke.resize((new_w, new_h), Image.LANCZOS)

        # Random position
        max_x = bg_w - new_w
        max_y = bg_h - new_h
        x = random.randint(0, max_x) if max_x > 0 else 0
        y = random.randint(0, max_y) if max_y > 0 else 0

        # Composite images
        canvas = bg.copy()
        canvas.alpha_composite(poke, (x, y))

        # Save as JPEG
        base, _ = os.path.splitext(poke_name)
        out_name = f"{base}_bg.jpg"
        out_path = os.path.join(OUT_DIR, out_name)
        canvas.convert("RGB").save(out_path, "JPEG", quality=90)

        print(f"[{i}/{total}] {poke_name} on {bg_name} → {out_name}")

if __name__ == "__main__":
    main()
[1/819] 1.png on 00000040_(6).jpg → 1_bg.jpg
[2/819] 10.png on 00000295_(3).jpg → 10_bg.jpg
[3/819] 100.png on 00000128_(5).jpg → 100_bg.jpg
[4/819] 101.png on 00000219_(3).jpg → 101_bg.jpg
[5/819] 102.png on 00000101_(3).jpg → 102_bg.jpg
[6/819] 103.png on 00000266_(2).jpg → 103_bg.jpg
[7/819] 104.png on 00000274_(2).jpg → 104_bg.jpg
[8/819] 105.png on 00000138_(5).jpg → 105_bg.jpg
[9/819] 106.png on 00000247_(3).jpg → 106_bg.jpg
[10/819] 107.png on 00000214_(2).jpg → 107_bg.jpg
[11/819] 108.png on 00000171_(4).jpg → 108_bg.jpg
[12/819] 109.png on 00000006.jpg → 109_bg.jpg
[13/819] 11.png on 00000067_(7).jpg → 11_bg.jpg
[14/819] 110.png on 00000024_(4).jpg → 110_bg.jpg
[15/819] 111.png on 00000066_(6).jpg → 111_bg.jpg
[16/819] 112.png on 00000149_(3).jpg → 112_bg.jpg
[17/819] 113.png on 00000170_(5).jpg → 113_bg.jpg
[18/819] 114.png on 00000278.jpg → 114_bg.jpg
[19/819] 115-mega.png on 00000049.jpg → 115-mega_bg.jpg
[20/819] 115.png on 00000300_(6).jpg → 115_bg.jpg
[21/819] 116.png on 00000214_(3).jpg → 116_bg.jpg
[22/819] 117.png on 00000116_(2).jpg → 117_bg.jpg
[23/819] 118.png on 00000077_(6).jpg → 118_bg.jpg
[24/819] 119.png on 00000110_(4).jpg → 119_bg.jpg
[25/819] 12.png on 00000123_(4).jpg → 12_bg.jpg
[26/819] 120.png on 00000296.jpg → 120_bg.jpg
[27/819] 121.png on 00000178_(3).jpg → 121_bg.jpg
[28/819] 122.png on 00000096_(4).jpg → 122_bg.jpg
[29/819] 123.png on 00000020_(2).jpg → 123_bg.jpg
[30/819] 124.png on 00000281_(5).jpg → 124_bg.jpg
[31/819] 125.png on 00000143_(3).jpg → 125_bg.jpg
[32/819] 126.png on 00000020_(5).jpg → 126_bg.jpg
[33/819] 127-mega.png on 00000193_(3).jpg → 127-mega_bg.jpg
[34/819] 127.png on 00000186_(2).jpg → 127_bg.jpg
[35/819] 128.png on 00000148_(3).jpg → 128_bg.jpg
[36/819] 129.png on 00000260_(3).jpg → 129_bg.jpg
[37/819] 13.png on 00000133_(5).jpg → 13_bg.jpg
[38/819] 130-mega.png on 00000272_(4).jpg → 130-mega_bg.jpg
[39/819] 130.png on 00000024_(3).jpg → 130_bg.jpg
[40/819] 131.png on 00000083_(3).jpg → 131_bg.jpg
[41/819] 132.png on 00000239_(4).jpg → 132_bg.jpg
[42/819] 133.png on 00000287_(3).jpg → 133_bg.jpg
[43/819] 134.png on 00000145_(5).jpg → 134_bg.jpg
[44/819] 135.png on 00000105_(3).jpg → 135_bg.jpg
[45/819] 136.png on 00000055.jpg → 136_bg.jpg
[46/819] 137.png on 00000270_(3).jpg → 137_bg.jpg
[47/819] 138.png on 00000183_(6).jpg → 138_bg.jpg
[48/819] 139.png on 00000219_(3).jpg → 139_bg.jpg
[49/819] 14.png on 00000221_(3).jpg → 14_bg.jpg
[50/819] 140.png on 00000124_(7).jpg → 140_bg.jpg
[51/819] 141.png on 00000240_(4).jpg → 141_bg.jpg
[52/819] 142-mega.png on 00000165_(3).jpg → 142-mega_bg.jpg
[53/819] 142.png on 00000166_(2).jpg → 142_bg.jpg
[54/819] 143.png on 00000217_(6).jpg → 143_bg.jpg
[55/819] 144.png on 00000140_(2).jpg → 144_bg.jpg
[56/819] 145.png on 00000009_(2).jpg → 145_bg.jpg
[57/819] 146.png on 00000303_(3).jpg → 146_bg.jpg
[58/819] 147.png on 00000091_(6).jpg → 147_bg.jpg
[59/819] 148.png on 00000072_(2).jpg → 148_bg.jpg
[60/819] 149.png on 00000044_(3).jpg → 149_bg.jpg
[61/819] 15-mega.png on 00000069_(3).jpg → 15-mega_bg.jpg
[62/819] 15.png on 00000240_(5).jpg → 15_bg.jpg
[63/819] 150-mega-x.png on 00000035_(6).jpg → 150-mega-x_bg.jpg
[64/819] 150-mega-y.png on 00000099_(4).jpg → 150-mega-y_bg.jpg
[65/819] 150.png on 00000246.jpg → 150_bg.jpg
[66/819] 151.png on 00000011_(4).jpg → 151_bg.jpg
[67/819] 152.png on 00000037.jpg → 152_bg.jpg
[68/819] 153.png on 00000030_(4).jpg → 153_bg.jpg
[69/819] 154.png on 00000021_(2).jpg → 154_bg.jpg
[70/819] 155.png on 00000212_(5).jpg → 155_bg.jpg
[71/819] 156.png on 00000143.jpg → 156_bg.jpg
[72/819] 157.png on 00000057_(7).jpg → 157_bg.jpg
[73/819] 158.png on 00000050.jpg → 158_bg.jpg
[74/819] 159.png on 00000121_(2).jpg → 159_bg.jpg
[75/819] 16.png on 00000211_(6).jpg → 16_bg.jpg
[76/819] 160.png on 00000011_(2).jpg → 160_bg.jpg
[77/819] 161.png on 00000156_(2).jpg → 161_bg.jpg
[78/819] 162.png on 00000277_(2).jpg → 162_bg.jpg
[79/819] 163.png on 00000020_(5).jpg → 163_bg.jpg
[80/819] 164.png on 00000137_(5).jpg → 164_bg.jpg
[81/819] 165.png on 00000251_(6).jpg → 165_bg.jpg
[82/819] 166.png on 00000062_(2).jpg → 166_bg.jpg
[83/819] 167.png on 00000262.jpg → 167_bg.jpg
[84/819] 168.png on 00000271_(2).jpg → 168_bg.jpg
[85/819] 169.png on 00000111_(5).jpg → 169_bg.jpg
[86/819] 17.png on 00000206_(6).jpg → 17_bg.jpg
[87/819] 170.png on 00000084_(6).jpg → 170_bg.jpg
[88/819] 171.png on 00000237_(6).jpg → 171_bg.jpg
[89/819] 172.png on 00000269_(6).jpg → 172_bg.jpg
[90/819] 173.png on 00000125_(5).jpg → 173_bg.jpg
[91/819] 174.png on 00000071_(3).jpg → 174_bg.jpg
[92/819] 175.png on 00000221_(2).jpg → 175_bg.jpg
[93/819] 176.png on 00000229_(2).jpg → 176_bg.jpg
[94/819] 177.png on 00000142_(5).jpg → 177_bg.jpg
[95/819] 178.png on 00000112.jpg → 178_bg.jpg
[96/819] 179.png on 00000150_(3).jpg → 179_bg.jpg
[97/819] 18-mega.png on 00000214_(2).jpg → 18-mega_bg.jpg
[98/819] 18.png on 00000174_(2).jpg → 18_bg.jpg
[99/819] 180.png on 00000018_(6).jpg → 180_bg.jpg
[100/819] 181-mega.png on 00000172_(5).jpg → 181-mega_bg.jpg
[101/819] 181.png on 00000095_(4).jpg → 181_bg.jpg
[102/819] 182.png on 00000245_(6).jpg → 182_bg.jpg
[103/819] 183.png on 00000017_(5).jpg → 183_bg.jpg
[104/819] 184.png on 00000244_(6).jpg → 184_bg.jpg
[105/819] 185.png on 00000227_(3).jpg → 185_bg.jpg
[106/819] 186.png on 00000125_(3).jpg → 186_bg.jpg
[107/819] 187.png on 00000072.jpg → 187_bg.jpg
[108/819] 188.png on 00000057_(6).jpg → 188_bg.jpg
[109/819] 189.png on 00000293_(3).jpg → 189_bg.jpg
[110/819] 19.png on 00000088_(5).jpg → 19_bg.jpg
[111/819] 190.png on 00000163_(5).jpg → 190_bg.jpg
[112/819] 191.png on 00000045.jpg → 191_bg.jpg
[113/819] 192.png on 00000193_(5).jpg → 192_bg.jpg
[114/819] 193.png on 00000045_(5).jpg → 193_bg.jpg
[115/819] 194.png on 00000004_(2).jpg → 194_bg.jpg
[116/819] 195.png on 00000202_(4).jpg → 195_bg.jpg
[117/819] 196.png on 00000110.jpg → 196_bg.jpg
[118/819] 197.png on 00000061_(2).jpg → 197_bg.jpg
[119/819] 198.png on 00000150_(2).jpg → 198_bg.jpg
[120/819] 199.png on 00000237_(4).jpg → 199_bg.jpg
[121/819] 2.png on 00000123_(2).jpg → 2_bg.jpg
[122/819] 20.png on 00000291_(3).jpg → 20_bg.jpg
[123/819] 200.png on 00000096_(2).jpg → 200_bg.jpg
[124/819] 201-f.png on 00000250_(2).jpg → 201-f_bg.jpg
[125/819] 202.png on 00000035.jpg → 202_bg.jpg
[126/819] 203.png on 00000288_(2).jpg → 203_bg.jpg
[127/819] 204.png on 00000153_(6).jpg → 204_bg.jpg
[128/819] 205.png on 00000204_(5).jpg → 205_bg.jpg
[129/819] 206.png on 00000099.jpg → 206_bg.jpg
[130/819] 207.png on 00000156_(3).jpg → 207_bg.jpg
[131/819] 208-mega.png on 00000258_(5).jpg → 208-mega_bg.jpg
[132/819] 208.png on 00000080_(4).jpg → 208_bg.jpg
[133/819] 209.png on 00000247_(4).jpg → 209_bg.jpg
[134/819] 21.png on 00000221_(4).jpg → 21_bg.jpg
[135/819] 210.png on 00000031_(6).jpg → 210_bg.jpg
[136/819] 211.png on 00000121_(2).jpg → 211_bg.jpg
[137/819] 212-mega.png on 00000045_(5).jpg → 212-mega_bg.jpg
[138/819] 212.png on 00000235_(5).jpg → 212_bg.jpg
[139/819] 213.png on 00000222_(6).jpg → 213_bg.jpg
[140/819] 214-mega.png on 00000243_(2).jpg → 214-mega_bg.jpg
[141/819] 214.png on 00000074.jpg → 214_bg.jpg
[142/819] 215.png on 00000025_(5).jpg → 215_bg.jpg
[143/819] 216.png on 00000025_(2).jpg → 216_bg.jpg
[144/819] 217.png on 00000172_(6).jpg → 217_bg.jpg
[145/819] 218.png on 00000095_(2).jpg → 218_bg.jpg
[146/819] 219.png on 00000302.jpg → 219_bg.jpg
[147/819] 22.png on 00000206_(6).jpg → 22_bg.jpg
[148/819] 220.png on 00000165_(2).jpg → 220_bg.jpg
[149/819] 221.png on 00000005_(4).jpg → 221_bg.jpg
[150/819] 222.png on 00000018_(2).jpg → 222_bg.jpg
[151/819] 223.png on 00000250_(2).jpg → 223_bg.jpg
[152/819] 224.png on 00000012_(5).jpg → 224_bg.jpg
[153/819] 225.png on 00000073_(6).jpg → 225_bg.jpg
[154/819] 226.png on 00000057_(5).jpg → 226_bg.jpg
[155/819] 227.png on 00000036_(2).jpg → 227_bg.jpg
[156/819] 228.png on 00000003_(3).jpg → 228_bg.jpg
[157/819] 229-mega.png on 00000135_(5).jpg → 229-mega_bg.jpg
[158/819] 229.png on 00000285_(4).jpg → 229_bg.jpg
[159/819] 23.png on 00000059_(5).jpg → 23_bg.jpg
[160/819] 230.png on 00000102_(4).jpg → 230_bg.jpg
[161/819] 231.png on 00000230_(6).jpg → 231_bg.jpg
[162/819] 232.png on 00000005_(2).jpg → 232_bg.jpg
[163/819] 233.png on 00000189_(2).jpg → 233_bg.jpg
[164/819] 234.png on 00000103.jpg → 234_bg.jpg
[165/819] 235.png on 00000060.jpg → 235_bg.jpg
[166/819] 236.png on 00000018_(4).jpg → 236_bg.jpg
[167/819] 237.png on 00000021_(7).jpg → 237_bg.jpg
[168/819] 238.png on 00000231_(5).jpg → 238_bg.jpg
[169/819] 239.png on 00000099_(3).jpg → 239_bg.jpg
[170/819] 24.png on 00000097_(2).jpg → 24_bg.jpg
[171/819] 240.png on 00000151_(3).jpg → 240_bg.jpg
[172/819] 241.png on 00000227_(2).jpg → 241_bg.jpg
[173/819] 242.png on 00000067.jpg → 242_bg.jpg
[174/819] 243.png on 00000032_(5).jpg → 243_bg.jpg
[175/819] 244.png on 00000192_(2).jpg → 244_bg.jpg
[176/819] 245.png on 00000091_(4).jpg → 245_bg.jpg
[177/819] 246.png on 00000045_(6).jpg → 246_bg.jpg
[178/819] 247.png on 00000101_(7).jpg → 247_bg.jpg
[179/819] 248-mega.png on 00000028_(3).jpg → 248-mega_bg.jpg
[180/819] 248.png on 00000171_(3).jpg → 248_bg.jpg
[181/819] 249.png on 00000139_(5).jpg → 249_bg.jpg
[182/819] 25-belle.png on 00000031_(4).jpg → 25-belle_bg.jpg
[183/819] 25-libre.png on 00000207_(2).jpg → 25-libre_bg.jpg
[184/819] 25-phd.png on 00000150_(6).jpg → 25-phd_bg.jpg
[185/819] 25-pop-star.png on 00000133_(4).jpg → 25-pop-star_bg.jpg
[186/819] 25-rock-star.png on 00000011_(7).jpg → 25-rock-star_bg.jpg
[187/819] 25.png on 00000007_(6).jpg → 25_bg.jpg
[188/819] 250.png on 00000037_(2).jpg → 250_bg.jpg
[189/819] 251.png on 00000198_(3).jpg → 251_bg.jpg
[190/819] 252.png on 00000169_(6).jpg → 252_bg.jpg
[191/819] 253.png on 00000294_(6).jpg → 253_bg.jpg
[192/819] 254-mega.png on 00000078.jpg → 254-mega_bg.jpg
[193/819] 254.png on 00000160_(3).jpg → 254_bg.jpg
[194/819] 255.png on 00000267_(2).jpg → 255_bg.jpg
[195/819] 256.png on 00000107_(4).jpg → 256_bg.jpg
[196/819] 257-mega.png on 00000023_(4).jpg → 257-mega_bg.jpg
[197/819] 257.png on 00000083_(2).jpg → 257_bg.jpg
[198/819] 258.png on 00000191_(4).jpg → 258_bg.jpg
[199/819] 259.png on 00000057_(5).jpg → 259_bg.jpg
[200/819] 26.png on 00000179_(4).jpg → 26_bg.jpg
[201/819] 260-mega.png on 00000203_(5).jpg → 260-mega_bg.jpg
[202/819] 260.png on 00000046_(3).jpg → 260_bg.jpg
[203/819] 261.png on 00000026_(4).jpg → 261_bg.jpg
[204/819] 262.png on 00000051_(2).jpg → 262_bg.jpg
[205/819] 263.png on 00000180_(5).jpg → 263_bg.jpg
[206/819] 264.png on 00000266_(5).jpg → 264_bg.jpg
[207/819] 265.png on 00000193_(4).jpg → 265_bg.jpg
[208/819] 266.png on 00000038_(6).jpg → 266_bg.jpg
[209/819] 267.png on 00000074_(3).jpg → 267_bg.jpg
[210/819] 268.png on 00000174_(6).jpg → 268_bg.jpg
[211/819] 269.png on 00000253_(2).jpg → 269_bg.jpg
[212/819] 27.png on 00000144_(6).jpg → 27_bg.jpg
[213/819] 270.png on 00000118_(3).jpg → 270_bg.jpg
[214/819] 271.png on 00000011_(5).jpg → 271_bg.jpg
[215/819] 272.png on 00000301_(4).jpg → 272_bg.jpg
[216/819] 273.png on 00000042_(7).jpg → 273_bg.jpg
[217/819] 274.png on 00000173_(4).jpg → 274_bg.jpg
[218/819] 275.png on 00000184_(2).jpg → 275_bg.jpg
[219/819] 276.png on 00000173_(4).jpg → 276_bg.jpg
[220/819] 277.png on 00000091_(6).jpg → 277_bg.jpg
[221/819] 278.png on 00000271_(6).jpg → 278_bg.jpg
[222/819] 279.png on 00000245_(6).jpg → 279_bg.jpg
[223/819] 28.png on 00000164_(3).jpg → 28_bg.jpg
[224/819] 280.png on 00000217_(3).jpg → 280_bg.jpg
[225/819] 281.png on 00000281_(2).jpg → 281_bg.jpg
[226/819] 282-mega.png on 00000172.jpg → 282-mega_bg.jpg
[227/819] 282.png on 00000089_(4).jpg → 282_bg.jpg
[228/819] 283.png on 00000301_(5).jpg → 283_bg.jpg
[229/819] 284.png on 00000035_(6).jpg → 284_bg.jpg
[230/819] 285.png on 00000067_(7).jpg → 285_bg.jpg
[231/819] 286.png on 00000038_(2).jpg → 286_bg.jpg
[232/819] 287.png on 00000070_(4).jpg → 287_bg.jpg
[233/819] 288.png on 00000001_(4).jpg → 288_bg.jpg
[234/819] 289.png on 00000022_(3).jpg → 289_bg.jpg
[235/819] 29.png on 00000221_(3).jpg → 29_bg.jpg
[236/819] 290.png on 00000216_(6).jpg → 290_bg.jpg
[237/819] 291.png on 00000284_(4).jpg → 291_bg.jpg
[238/819] 292.png on 00000010_(7).jpg → 292_bg.jpg
[239/819] 293.png on 00000293_(3).jpg → 293_bg.jpg
[240/819] 294.png on 00000205_(2).jpg → 294_bg.jpg
[241/819] 295.png on 00000126_(7).jpg → 295_bg.jpg
[242/819] 296.png on 00000228_(4).jpg → 296_bg.jpg
[243/819] 297.png on 00000263_(3).jpg → 297_bg.jpg
[244/819] 298.png on 00000234_(6).jpg → 298_bg.jpg
[245/819] 299.png on 00000239_(6).jpg → 299_bg.jpg
[246/819] 3-mega.png on 00000195_(4).jpg → 3-mega_bg.jpg
[247/819] 3.png on 00000277_(5).jpg → 3_bg.jpg
[248/819] 30.png on 00000105_(4).jpg → 30_bg.jpg
[249/819] 300.png on 00000121_(7).jpg → 300_bg.jpg
[250/819] 301.png on 00000135_(6).jpg → 301_bg.jpg
[251/819] 302-mega.png on 00000217_(6).jpg → 302-mega_bg.jpg
[252/819] 302.png on 00000149_(6).jpg → 302_bg.jpg
[253/819] 303-mega.png on 00000111_(6).jpg → 303-mega_bg.jpg
[254/819] 303.png on 00000181_(4).jpg → 303_bg.jpg
[255/819] 304.png on 00000229.jpg → 304_bg.jpg
[256/819] 305.png on 00000142_(4).jpg → 305_bg.jpg
[257/819] 306-mega.png on 00000155_(5).jpg → 306-mega_bg.jpg
[258/819] 306.png on 00000135_(6).jpg → 306_bg.jpg
[259/819] 307.png on 00000287_(2).jpg → 307_bg.jpg
[260/819] 308-mega.png on 00000087_(4).jpg → 308-mega_bg.jpg
[261/819] 308.png on 00000253_(4).jpg → 308_bg.jpg
[262/819] 309.png on 00000013_(2).jpg → 309_bg.jpg
[263/819] 31.png on 00000008.jpg → 31_bg.jpg
[264/819] 310-mega.png on 00000134_(4).jpg → 310-mega_bg.jpg
[265/819] 310.png on 00000230_(4).jpg → 310_bg.jpg
[266/819] 311.png on 00000235_(2).jpg → 311_bg.jpg
[267/819] 312.png on 00000039_(5).jpg → 312_bg.jpg
[268/819] 313.png on 00000192_(3).jpg → 313_bg.jpg
[269/819] 314.png on 00000077_(4).jpg → 314_bg.jpg
[270/819] 315.png on 00000115_(2).jpg → 315_bg.jpg
[271/819] 316.png on 00000183_(4).jpg → 316_bg.jpg
[272/819] 317.png on 00000002_(6).jpg → 317_bg.jpg
[273/819] 318.png on 00000041_(4).jpg → 318_bg.jpg
[274/819] 319-mega.png on 00000022.jpg → 319-mega_bg.jpg
[275/819] 319.png on 00000151_(6).jpg → 319_bg.jpg
[276/819] 32.png on 00000075.jpg → 32_bg.jpg
[277/819] 320.png on 00000163_(5).jpg → 320_bg.jpg
[278/819] 321.png on 00000001_(4).jpg → 321_bg.jpg
[279/819] 322.png on 00000016.jpg → 322_bg.jpg
[280/819] 323-mega.png on 00000070_(6).jpg → 323-mega_bg.jpg
[281/819] 323.png on 00000056_(5).jpg → 323_bg.jpg
[282/819] 324.png on 00000238_(2).jpg → 324_bg.jpg
[283/819] 325.png on 00000044_(3).jpg → 325_bg.jpg
[284/819] 326.png on 00000192_(4).jpg → 326_bg.jpg
[285/819] 327.png on 00000210_(3).jpg → 327_bg.jpg
[286/819] 328.png on 00000163_(3).jpg → 328_bg.jpg
[287/819] 329.png on 00000293_(2).jpg → 329_bg.jpg
[288/819] 33.png on 00000185_(2).jpg → 33_bg.jpg
[289/819] 330.png on 00000098_(3).jpg → 330_bg.jpg
[290/819] 331.png on 00000187_(4).jpg → 331_bg.jpg
[291/819] 332.png on 00000101_(3).jpg → 332_bg.jpg
[292/819] 333.png on 00000153_(5).jpg → 333_bg.jpg
[293/819] 334-mega.png on 00000053_(5).jpg → 334-mega_bg.jpg
[294/819] 334.png on 00000258_(3).jpg → 334_bg.jpg
[295/819] 335.png on 00000105_(6).jpg → 335_bg.jpg
[296/819] 336.png on 00000268_(4).jpg → 336_bg.jpg
[297/819] 337.png on 00000109_(5).jpg → 337_bg.jpg
[298/819] 338.png on 00000235_(2).jpg → 338_bg.jpg
[299/819] 339.png on 00000152_(2).jpg → 339_bg.jpg
[300/819] 34.png on 00000020_(2).jpg → 34_bg.jpg
[301/819] 340.png on 00000210_(2).jpg → 340_bg.jpg
[302/819] 341.png on 00000212_(2).jpg → 341_bg.jpg
[303/819] 342.png on 00000114_(3).jpg → 342_bg.jpg
[304/819] 343.png on 00000019_(3).jpg → 343_bg.jpg
[305/819] 344.png on 00000197_(3).jpg → 344_bg.jpg
[306/819] 345.png on 00000073_(2).jpg → 345_bg.jpg
[307/819] 346.png on 00000133.jpg → 346_bg.jpg
[308/819] 347.png on 00000017_(5).jpg → 347_bg.jpg
[309/819] 348.png on 00000091_(5).jpg → 348_bg.jpg
[310/819] 349.png on 00000117_(4).jpg → 349_bg.jpg
[311/819] 35.png on 00000048_(2).jpg → 35_bg.jpg
[312/819] 350.png on 00000070_(5).jpg → 350_bg.jpg
[313/819] 351.png on 00000111_(3).jpg → 351_bg.jpg
[314/819] 352.png on 00000206_(6).jpg → 352_bg.jpg
[315/819] 353.png on 00000026.jpg → 353_bg.jpg
[316/819] 354-mega.png on 00000110_(5).jpg → 354-mega_bg.jpg
[317/819] 354.png on 00000289_(3).jpg → 354_bg.jpg
[318/819] 355.png on 00000189_(5).jpg → 355_bg.jpg
[319/819] 356.png on 00000290_(3).jpg → 356_bg.jpg
[320/819] 357.png on 00000209_(5).jpg → 357_bg.jpg
[321/819] 358.png on 00000148_(4).jpg → 358_bg.jpg
[322/819] 359-mega.png on 00000228.jpg → 359-mega_bg.jpg
[323/819] 359.png on 00000171_(6).jpg → 359_bg.jpg
[324/819] 36.png on 00000152_(3).jpg → 36_bg.jpg
[325/819] 360.png on 00000270_(6).jpg → 360_bg.jpg
[326/819] 361.png on 00000020_(5).jpg → 361_bg.jpg
[327/819] 362-mega.png on 00000208_(3).jpg → 362-mega_bg.jpg
[328/819] 362.png on 00000150_(5).jpg → 362_bg.jpg
[329/819] 363.png on 00000193_(6).jpg → 363_bg.jpg
[330/819] 364.png on 00000253_(3).jpg → 364_bg.jpg
[331/819] 365.png on 00000062_(3).jpg → 365_bg.jpg
[332/819] 366.png on 00000065_(5).jpg → 366_bg.jpg
[333/819] 367.png on 00000024_(6).jpg → 367_bg.jpg
[334/819] 368.png on 00000061_(5).jpg → 368_bg.jpg
[335/819] 369.png on 00000205_(3).jpg → 369_bg.jpg
[336/819] 37.png on 00000244.jpg → 37_bg.jpg
[337/819] 370.png on 00000003_(2).jpg → 370_bg.jpg
[338/819] 371.png on 00000156_(2).jpg → 371_bg.jpg
[339/819] 372.png on 00000148_(5).jpg → 372_bg.jpg
[340/819] 373-mega.png on 00000137_(2).jpg → 373-mega_bg.jpg
[341/819] 373.png on 00000094.jpg → 373_bg.jpg
[342/819] 374.png on 00000157.jpg → 374_bg.jpg
[343/819] 375.png on 00000031_(4).jpg → 375_bg.jpg
[344/819] 376-mega.png on 00000256.jpg → 376-mega_bg.jpg
[345/819] 376.png on 00000221_(5).jpg → 376_bg.jpg
[346/819] 377.png on 00000096_(6).jpg → 377_bg.jpg
[347/819] 378.png on 00000082_(3).jpg → 378_bg.jpg
[348/819] 379.png on 00000073_(6).jpg → 379_bg.jpg
[349/819] 38.png on 00000228_(6).jpg → 38_bg.jpg
[350/819] 380-mega.png on 00000203_(5).jpg → 380-mega_bg.jpg
[351/819] 380.png on 00000281.jpg → 380_bg.jpg
[352/819] 381-mega.png on 00000013_(6).jpg → 381-mega_bg.jpg
[353/819] 381.png on 00000170_(6).jpg → 381_bg.jpg
[354/819] 382-primal.png on 00000291_(5).jpg → 382-primal_bg.jpg
[355/819] 382.png on 00000017_(6).jpg → 382_bg.jpg
[356/819] 383-primal.png on 00000079_(3).jpg → 383-primal_bg.jpg
[357/819] 383.png on 00000069_(6).jpg → 383_bg.jpg
[358/819] 384-mega.png on 00000195_(6).jpg → 384-mega_bg.jpg
[359/819] 384.png on 00000055_(6).jpg → 384_bg.jpg
[360/819] 385.png on 00000126_(5).jpg → 385_bg.jpg
[361/819] 386-attack.png on 00000023_(2).jpg → 386-attack_bg.jpg
[362/819] 386-defense.png on 00000256_(3).jpg → 386-defense_bg.jpg
[363/819] 386-normal.png on 00000279_(6).jpg → 386-normal_bg.jpg
[364/819] 386-speed.png on 00000005_(3).jpg → 386-speed_bg.jpg
[365/819] 387.png on 00000126_(3).jpg → 387_bg.jpg
[366/819] 388.png on 00000047_(7).jpg → 388_bg.jpg
[367/819] 389.png on 00000092_(2).jpg → 389_bg.jpg
[368/819] 39.png on 00000110_(5).jpg → 39_bg.jpg
[369/819] 390.png on 00000029_(6).jpg → 390_bg.jpg
[370/819] 391.png on 00000014_(2).jpg → 391_bg.jpg
[371/819] 392.png on 00000042_(2).jpg → 392_bg.jpg
[372/819] 393.png on 00000152_(2).jpg → 393_bg.jpg
[373/819] 394.png on 00000260_(6).jpg → 394_bg.jpg
[374/819] 395.png on 00000294.jpg → 395_bg.jpg
[375/819] 396.png on 00000228_(6).jpg → 396_bg.jpg
[376/819] 397.png on 00000130.jpg → 397_bg.jpg
[377/819] 398.png on 00000062.jpg → 398_bg.jpg
[378/819] 399.png on 00000281_(6).jpg → 399_bg.jpg
[379/819] 4.png on 00000278_(6).jpg → 4_bg.jpg
[380/819] 40.png on 00000243_(2).jpg → 40_bg.jpg
[381/819] 400.png on 00000056_(5).jpg → 400_bg.jpg
[382/819] 401.png on 00000279_(5).jpg → 401_bg.jpg
[383/819] 402.png on 00000135_(4).jpg → 402_bg.jpg
[384/819] 403.png on 00000218_(2).jpg → 403_bg.jpg
[385/819] 404.png on 00000093_(2).jpg → 404_bg.jpg
[386/819] 405.png on 00000259_(3).jpg → 405_bg.jpg
[387/819] 406.png on 00000164_(5).jpg → 406_bg.jpg
[388/819] 407.png on 00000112_(5).jpg → 407_bg.jpg
[389/819] 408.png on 00000227.jpg → 408_bg.jpg
[390/819] 409.png on 00000186_(2).jpg → 409_bg.jpg
[391/819] 41.png on 00000083_(5).jpg → 41_bg.jpg
[392/819] 410.png on 00000169.jpg → 410_bg.jpg
[393/819] 411.png on 00000108_(4).jpg → 411_bg.jpg
[394/819] 412-plant.png on 00000255_(6).jpg → 412-plant_bg.jpg
[395/819] 412-sandy.png on 00000137_(2).jpg → 412-sandy_bg.jpg
[396/819] 412-trash.png on 00000014.jpg → 412-trash_bg.jpg
[397/819] 413-plant.png on 00000131_(4).jpg → 413-plant_bg.jpg
[398/819] 413-sandy.png on 00000137_(3).jpg → 413-sandy_bg.jpg
[399/819] 413-trash.png on 00000076.jpg → 413-trash_bg.jpg
[400/819] 414.png on 00000117_(4).jpg → 414_bg.jpg
[401/819] 415.png on 00000279_(4).jpg → 415_bg.jpg
[402/819] 416.png on 00000244_(6).jpg → 416_bg.jpg
[403/819] 417.png on 00000064_(4).jpg → 417_bg.jpg
[404/819] 418.png on 00000069_(2).jpg → 418_bg.jpg
[405/819] 419.png on 00000296_(5).jpg → 419_bg.jpg
[406/819] 42.png on 00000165_(3).jpg → 42_bg.jpg
[407/819] 420.png on 00000227_(5).jpg → 420_bg.jpg
[408/819] 421-overcast.png on 00000247_(2).jpg → 421-overcast_bg.jpg
[409/819] 421-sunshine.png on 00000092_(4).jpg → 421-sunshine_bg.jpg
[410/819] 422-east.png on 00000051_(3).jpg → 422-east_bg.jpg
[411/819] 422-west.png on 00000276_(3).jpg → 422-west_bg.jpg
[412/819] 423-east.png on 00000050_(4).jpg → 423-east_bg.jpg
[413/819] 423-west.png on 00000298_(3).jpg → 423-west_bg.jpg
[414/819] 424.png on 00000067_(3).jpg → 424_bg.jpg
[415/819] 425.png on 00000073_(2).jpg → 425_bg.jpg
[416/819] 426.png on 00000107_(7).jpg → 426_bg.jpg
[417/819] 427.png on 00000301_(6).jpg → 427_bg.jpg
[418/819] 428-mega.png on 00000196_(2).jpg → 428-mega_bg.jpg
[419/819] 428.png on 00000267_(2).jpg → 428_bg.jpg
[420/819] 429.png on 00000000.jpg → 429_bg.jpg
[421/819] 43.png on 00000274_(3).jpg → 43_bg.jpg
[422/819] 430.png on 00000103_(5).jpg → 430_bg.jpg
[423/819] 431.png on 00000199_(2).jpg → 431_bg.jpg
[424/819] 432.png on 00000094_(3).jpg → 432_bg.jpg
[425/819] 433.png on 00000142_(2).jpg → 433_bg.jpg
[426/819] 434.png on 00000278.jpg → 434_bg.jpg
[427/819] 435.png on 00000082_(5).jpg → 435_bg.jpg
[428/819] 436.png on 00000058_(5).jpg → 436_bg.jpg
[429/819] 437.png on 00000018.jpg → 437_bg.jpg
[430/819] 438.png on 00000136_(6).jpg → 438_bg.jpg
[431/819] 439.png on 00000128_(3).jpg → 439_bg.jpg
[432/819] 44.png on 00000245_(2).jpg → 44_bg.jpg
[433/819] 440.png on 00000301_(6).jpg → 440_bg.jpg
[434/819] 441.png on 00000066_(4).jpg → 441_bg.jpg
[435/819] 442.png on 00000170_(3).jpg → 442_bg.jpg
[436/819] 443.png on 00000247_(2).jpg → 443_bg.jpg
[437/819] 444.png on 00000287_(4).jpg → 444_bg.jpg
[438/819] 445-mega.png on 00000262.jpg → 445-mega_bg.jpg
[439/819] 445.png on 00000300_(6).jpg → 445_bg.jpg
[440/819] 446.png on 00000191_(4).jpg → 446_bg.jpg
[441/819] 447.png on 00000238_(6).jpg → 447_bg.jpg
[442/819] 448-mega.png on 00000020_(3).jpg → 448-mega_bg.jpg
[443/819] 448.png on 00000255_(4).jpg → 448_bg.jpg
[444/819] 449.png on 00000169_(6).jpg → 449_bg.jpg
[445/819] 45.png on 00000112_(3).jpg → 45_bg.jpg
[446/819] 450.png on 00000166_(5).jpg → 450_bg.jpg
[447/819] 451.png on 00000050.jpg → 451_bg.jpg
[448/819] 452.png on 00000225_(2).jpg → 452_bg.jpg
[449/819] 453.png on 00000044_(6).jpg → 453_bg.jpg
[450/819] 454.png on 00000067_(5).jpg → 454_bg.jpg
[451/819] 455.png on 00000301_(2).jpg → 455_bg.jpg
[452/819] 456.png on 00000016.jpg → 456_bg.jpg
[453/819] 457.png on 00000133_(2).jpg → 457_bg.jpg
[454/819] 458.png on 00000286_(4).jpg → 458_bg.jpg
[455/819] 459.png on 00000188_(3).jpg → 459_bg.jpg
[456/819] 46.png on 00000261_(6).jpg → 46_bg.jpg
[457/819] 460-mega.png on 00000226_(2).jpg → 460-mega_bg.jpg
[458/819] 460.png on 00000122.jpg → 460_bg.jpg
[459/819] 461.png on 00000181_(3).jpg → 461_bg.jpg
[460/819] 462.png on 00000189_(3).jpg → 462_bg.jpg
[461/819] 463.png on 00000291_(3).jpg → 463_bg.jpg
[462/819] 464.png on 00000172_(3).jpg → 464_bg.jpg
[463/819] 465.png on 00000088_(6).jpg → 465_bg.jpg
[464/819] 466.png on 00000252_(4).jpg → 466_bg.jpg
[465/819] 467.png on 00000001.jpg → 467_bg.jpg
[466/819] 468.png on 00000028.jpg → 468_bg.jpg
[467/819] 469.png on 00000097_(2).jpg → 469_bg.jpg
[468/819] 47.png on 00000194.jpg → 47_bg.jpg
[469/819] 470.png on 00000189_(5).jpg → 470_bg.jpg
[470/819] 471.png on 00000143_(6).jpg → 471_bg.jpg
[471/819] 472.png on 00000269_(6).jpg → 472_bg.jpg
[472/819] 473.png on 00000199_(5).jpg → 473_bg.jpg
[473/819] 474.png on 00000079_(4).jpg → 474_bg.jpg
[474/819] 475-mega.png on 00000152_(5).jpg → 475-mega_bg.jpg
[475/819] 475.png on 00000058.jpg → 475_bg.jpg
[476/819] 476.png on 00000227_(6).jpg → 476_bg.jpg
[477/819] 477.png on 00000207_(2).jpg → 477_bg.jpg
[478/819] 478.png on 00000061_(6).jpg → 478_bg.jpg
[479/819] 479-fan.png on 00000194_(3).jpg → 479-fan_bg.jpg
[480/819] 479-frost.png on 00000042_(3).jpg → 479-frost_bg.jpg
[481/819] 479-heat.png on 00000104.jpg → 479-heat_bg.jpg
[482/819] 479-mow.png on 00000187.jpg → 479-mow_bg.jpg
[483/819] 479-wash.png on 00000299_(2).jpg → 479-wash_bg.jpg
[484/819] 479.png on 00000176_(6).jpg → 479_bg.jpg
[485/819] 48.png on 00000111_(2).jpg → 48_bg.jpg
[486/819] 480.png on 00000127.jpg → 480_bg.jpg
[487/819] 481.png on 00000113_(4).jpg → 481_bg.jpg
[488/819] 482.png on 00000221_(6).jpg → 482_bg.jpg
[489/819] 483.png on 00000017_(7).jpg → 483_bg.jpg
[490/819] 484.png on 00000159_(4).jpg → 484_bg.jpg
[491/819] 485.png on 00000247_(6).jpg → 485_bg.jpg
[492/819] 486.png on 00000180_(2).jpg → 486_bg.jpg
[493/819] 487-altered.png on 00000255_(2).jpg → 487-altered_bg.jpg
[494/819] 487-origin.png on 00000033_(3).jpg → 487-origin_bg.jpg
[495/819] 488.png on 00000197_(2).jpg → 488_bg.jpg
[496/819] 489.png on 00000137_(2).jpg → 489_bg.jpg
[497/819] 49.png on 00000101_(5).jpg → 49_bg.jpg
[498/819] 490.png on 00000038_(2).jpg → 490_bg.jpg
[499/819] 491.png on 00000097_(4).jpg → 491_bg.jpg
[500/819] 492-land.png on 00000002_(3).jpg → 492-land_bg.jpg
[501/819] 492-sky.png on 00000075_(6).jpg → 492-sky_bg.jpg
[502/819] 493-normal.png on 00000202_(4).jpg → 493-normal_bg.jpg
[503/819] 494.png on 00000269_(2).jpg → 494_bg.jpg
[504/819] 495.png on 00000085.jpg → 495_bg.jpg
[505/819] 496.png on 00000092_(6).jpg → 496_bg.jpg
[506/819] 497.png on 00000085_(5).jpg → 497_bg.jpg
[507/819] 498.png on 00000106.jpg → 498_bg.jpg
[508/819] 499.png on 00000166_(6).jpg → 499_bg.jpg
[509/819] 5.png on 00000049_(4).jpg → 5_bg.jpg
[510/819] 50.png on 00000303_(3).jpg → 50_bg.jpg
[511/819] 500.png on 00000119_(6).jpg → 500_bg.jpg
[512/819] 501.png on 00000111_(6).jpg → 501_bg.jpg
[513/819] 502.png on 00000078_(2).jpg → 502_bg.jpg
[514/819] 503.png on 00000156_(5).jpg → 503_bg.jpg
[515/819] 504.png on 00000088_(3).jpg → 504_bg.jpg
[516/819] 505.png on 00000038_(4).jpg → 505_bg.jpg
[517/819] 506.png on 00000151_(3).jpg → 506_bg.jpg
[518/819] 507.png on 00000064_(7).jpg → 507_bg.jpg
[519/819] 508.png on 00000159_(5).jpg → 508_bg.jpg
[520/819] 509.png on 00000041_(5).jpg → 509_bg.jpg
[521/819] 51.png on 00000237.jpg → 51_bg.jpg
[522/819] 510.png on 00000013_(5).jpg → 510_bg.jpg
[523/819] 511.png on 00000118_(4).jpg → 511_bg.jpg
[524/819] 512.png on 00000128_(4).jpg → 512_bg.jpg
[525/819] 513.png on 00000068_(6).jpg → 513_bg.jpg
[526/819] 514.png on 00000053_(4).jpg → 514_bg.jpg
[527/819] 515.png on 00000217_(6).jpg → 515_bg.jpg
[528/819] 516.png on 00000087_(2).jpg → 516_bg.jpg
[529/819] 517.png on 00000015_(4).jpg → 517_bg.jpg
[530/819] 518.png on 00000021_(7).jpg → 518_bg.jpg
[531/819] 519.png on 00000295_(4).jpg → 519_bg.jpg
[532/819] 52.png on 00000220_(6).jpg → 52_bg.jpg
[533/819] 520.png on 00000122_(3).jpg → 520_bg.jpg
[534/819] 521.png on 00000073_(5).jpg → 521_bg.jpg
[535/819] 521f.png on 00000056_(3).jpg → 521f_bg.jpg
[536/819] 522.png on 00000069_(2).jpg → 522_bg.jpg
[537/819] 523.png on 00000005_(3).jpg → 523_bg.jpg
[538/819] 524.png on 00000153_(6).jpg → 524_bg.jpg
[539/819] 525.png on 00000068_(7).jpg → 525_bg.jpg
[540/819] 526.png on 00000295_(3).jpg → 526_bg.jpg
[541/819] 527.png on 00000157_(6).jpg → 527_bg.jpg
[542/819] 528.png on 00000060_(3).jpg → 528_bg.jpg
[543/819] 529.png on 00000292_(2).jpg → 529_bg.jpg
[544/819] 53.png on 00000234_(3).jpg → 53_bg.jpg
[545/819] 530.png on 00000220.jpg → 530_bg.jpg
[546/819] 531-mega.png on 00000177_(5).jpg → 531-mega_bg.jpg
[547/819] 531.png on 00000259_(2).jpg → 531_bg.jpg
[548/819] 532.png on 00000257_(2).jpg → 532_bg.jpg
[549/819] 533.png on 00000129_(4).jpg → 533_bg.jpg
[550/819] 534.png on 00000227_(4).jpg → 534_bg.jpg
[551/819] 535.png on 00000064_(3).jpg → 535_bg.jpg
[552/819] 536.png on 00000254_(4).jpg → 536_bg.jpg
[553/819] 537.png on 00000247_(3).jpg → 537_bg.jpg
[554/819] 538.png on 00000030_(6).jpg → 538_bg.jpg
[555/819] 539.png on 00000156_(6).jpg → 539_bg.jpg
[556/819] 54.png on 00000092_(3).jpg → 54_bg.jpg
[557/819] 540.png on 00000149_(6).jpg → 540_bg.jpg
[558/819] 541.png on 00000013_(7).jpg → 541_bg.jpg
[559/819] 542.png on 00000009.jpg → 542_bg.jpg
[560/819] 543.png on 00000069_(6).jpg → 543_bg.jpg
[561/819] 544.png on 00000227_(6).jpg → 544_bg.jpg
[562/819] 545.png on 00000259_(4).jpg → 545_bg.jpg
[563/819] 546.png on 00000167.jpg → 546_bg.jpg
[564/819] 547.png on 00000032_(4).jpg → 547_bg.jpg
[565/819] 548.png on 00000074_(3).jpg → 548_bg.jpg
[566/819] 549.png on 00000190.jpg → 549_bg.jpg
[567/819] 55.png on 00000214.jpg → 55_bg.jpg
[568/819] 550-blue-striped.png on 00000016_(4).jpg → 550-blue-striped_bg.jpg
[569/819] 550-red-striped.png on 00000194_(5).jpg → 550-red-striped_bg.jpg
[570/819] 551.png on 00000022.jpg → 551_bg.jpg
[571/819] 552.png on 00000170_(2).jpg → 552_bg.jpg
[572/819] 553.png on 00000184_(6).jpg → 553_bg.jpg
[573/819] 554.png on 00000159.jpg → 554_bg.jpg
[574/819] 555-standard.png on 00000279_(5).jpg → 555-standard_bg.jpg
[575/819] 556.png on 00000016_(4).jpg → 556_bg.jpg
[576/819] 557.png on 00000169_(3).jpg → 557_bg.jpg
[577/819] 558.png on 00000055_(3).jpg → 558_bg.jpg
[578/819] 559.png on 00000299.jpg → 559_bg.jpg
[579/819] 56.png on 00000254_(6).jpg → 56_bg.jpg
[580/819] 560.png on 00000246_(3).jpg → 560_bg.jpg
[581/819] 561.png on 00000299_(4).jpg → 561_bg.jpg
[582/819] 562.png on 00000106_(4).jpg → 562_bg.jpg
[583/819] 563.png on 00000296_(3).jpg → 563_bg.jpg
[584/819] 564.png on 00000127_(3).jpg → 564_bg.jpg
[585/819] 565.png on 00000288_(4).jpg → 565_bg.jpg
[586/819] 566.png on 00000198_(6).jpg → 566_bg.jpg
[587/819] 567.png on 00000107_(5).jpg → 567_bg.jpg
[588/819] 568.png on 00000262_(4).jpg → 568_bg.jpg
[589/819] 569.png on 00000099_(5).jpg → 569_bg.jpg
[590/819] 57.png on 00000195.jpg → 57_bg.jpg
[591/819] 570.png on 00000180_(2).jpg → 570_bg.jpg
[592/819] 571.png on 00000127_(4).jpg → 571_bg.jpg
[593/819] 572.png on 00000031_(5).jpg → 572_bg.jpg
[594/819] 573.png on 00000123_(4).jpg → 573_bg.jpg
[595/819] 574.png on 00000089_(4).jpg → 574_bg.jpg
[596/819] 575.png on 00000289_(6).jpg → 575_bg.jpg
[597/819] 576.png on 00000257_(2).jpg → 576_bg.jpg
[598/819] 577.png on 00000068_(5).jpg → 577_bg.jpg
[599/819] 578.png on 00000126_(3).jpg → 578_bg.jpg
[600/819] 579.png on 00000081.jpg → 579_bg.jpg
[601/819] 58.png on 00000220_(3).jpg → 58_bg.jpg
[602/819] 580.png on 00000035.jpg → 580_bg.jpg
[603/819] 581.png on 00000297_(6).jpg → 581_bg.jpg
[604/819] 582.png on 00000183_(7).jpg → 582_bg.jpg
[605/819] 583.png on 00000295_(3).jpg → 583_bg.jpg
[606/819] 584.png on 00000288_(5).jpg → 584_bg.jpg
[607/819] 585-autumn.png on 00000109.jpg → 585-autumn_bg.jpg
[608/819] 585-spring.png on 00000261_(5).jpg → 585-spring_bg.jpg
[609/819] 585-summer.png on 00000196_(6).jpg → 585-summer_bg.jpg
[610/819] 585-winter.png on 00000115_(3).jpg → 585-winter_bg.jpg
[611/819] 586-autumn.png on 00000257_(4).jpg → 586-autumn_bg.jpg
[612/819] 586-spring.png on 00000284_(3).jpg → 586-spring_bg.jpg
[613/819] 586-summer.png on 00000226_(3).jpg → 586-summer_bg.jpg
[614/819] 586-winter.png on 00000281_(3).jpg → 586-winter_bg.jpg
[615/819] 587.png on 00000029.jpg → 587_bg.jpg
[616/819] 588.png on 00000220_(3).jpg → 588_bg.jpg
[617/819] 589.png on 00000254_(3).jpg → 589_bg.jpg
[618/819] 59.png on 00000016_(2).jpg → 59_bg.jpg
[619/819] 590.png on 00000233.jpg → 590_bg.jpg
[620/819] 591.png on 00000070_(5).jpg → 591_bg.jpg
[621/819] 592.png on 00000118_(5).jpg → 592_bg.jpg
[622/819] 592f.png on 00000030_(4).jpg → 592f_bg.jpg
[623/819] 593.png on 00000102_(5).jpg → 593_bg.jpg
[624/819] 593f.png on 00000022_(3).jpg → 593f_bg.jpg
[625/819] 594.png on 00000143_(3).jpg → 594_bg.jpg
[626/819] 595.png on 00000295_(2).jpg → 595_bg.jpg
[627/819] 596.png on 00000010_(6).jpg → 596_bg.jpg
[628/819] 597.png on 00000079_(4).jpg → 597_bg.jpg
[629/819] 598.png on 00000303_(4).jpg → 598_bg.jpg
[630/819] 599.png on 00000232_(3).jpg → 599_bg.jpg
[631/819] 6-mega-x.png on 00000133_(3).jpg → 6-mega-x_bg.jpg
[632/819] 6-mega-y.png on 00000175_(3).jpg → 6-mega-y_bg.jpg
[633/819] 6.png on 00000145_(5).jpg → 6_bg.jpg
[634/819] 60.png on 00000209_(6).jpg → 60_bg.jpg
[635/819] 600.png on 00000286_(4).jpg → 600_bg.jpg
[636/819] 601.png on 00000139_(6).jpg → 601_bg.jpg
[637/819] 602.png on 00000076_(4).jpg → 602_bg.jpg
[638/819] 603.png on 00000189_(6).jpg → 603_bg.jpg
[639/819] 604.png on 00000052.jpg → 604_bg.jpg
[640/819] 605.png on 00000024_(2).jpg → 605_bg.jpg
[641/819] 606.png on 00000125_(6).jpg → 606_bg.jpg
[642/819] 607.png on 00000290_(4).jpg → 607_bg.jpg
[643/819] 608.png on 00000273_(5).jpg → 608_bg.jpg
[644/819] 609.png on 00000074.jpg → 609_bg.jpg
[645/819] 61.png on 00000033_(4).jpg → 61_bg.jpg
[646/819] 610.png on 00000171_(6).jpg → 610_bg.jpg
[647/819] 611.png on 00000254_(3).jpg → 611_bg.jpg
[648/819] 612.png on 00000161_(6).jpg → 612_bg.jpg
[649/819] 613.png on 00000141.jpg → 613_bg.jpg
[650/819] 614.png on 00000128_(3).jpg → 614_bg.jpg
[651/819] 615.png on 00000032_(2).jpg → 615_bg.jpg
[652/819] 616.png on 00000286_(5).jpg → 616_bg.jpg
[653/819] 617.png on 00000232_(2).jpg → 617_bg.jpg
[654/819] 618.png on 00000164_(2).jpg → 618_bg.jpg
[655/819] 619.png on 00000102_(6).jpg → 619_bg.jpg
[656/819] 62.png on 00000214_(3).jpg → 62_bg.jpg
[657/819] 620.png on 00000178_(3).jpg → 620_bg.jpg
[658/819] 621.png on 00000189.jpg → 621_bg.jpg
[659/819] 622.png on 00000258_(5).jpg → 622_bg.jpg
[660/819] 623.png on 00000123_(6).jpg → 623_bg.jpg
[661/819] 624.png on 00000040.jpg → 624_bg.jpg
[662/819] 625.png on 00000054_(7).jpg → 625_bg.jpg
[663/819] 626.png on 00000272_(3).jpg → 626_bg.jpg
[664/819] 627.png on 00000013_(3).jpg → 627_bg.jpg
[665/819] 628.png on 00000213_(6).jpg → 628_bg.jpg
[666/819] 629.png on 00000126_(4).jpg → 629_bg.jpg
[667/819] 63.png on 00000122.jpg → 63_bg.jpg
[668/819] 630.png on 00000086_(5).jpg → 630_bg.jpg
[669/819] 631.png on 00000209_(3).jpg → 631_bg.jpg
[670/819] 632.png on 00000218_(3).jpg → 632_bg.jpg
[671/819] 633.png on 00000057_(4).jpg → 633_bg.jpg
[672/819] 634.png on 00000227_(5).jpg → 634_bg.jpg
[673/819] 635.png on 00000112_(5).jpg → 635_bg.jpg
[674/819] 636.png on 00000214.jpg → 636_bg.jpg
[675/819] 637.png on 00000007_(4).jpg → 637_bg.jpg
[676/819] 638.png on 00000252_(2).jpg → 638_bg.jpg
[677/819] 639.png on 00000045_(5).jpg → 639_bg.jpg
[678/819] 64.png on 00000151.jpg → 64_bg.jpg
[679/819] 640.png on 00000299_(6).jpg → 640_bg.jpg
[680/819] 641-incarnate.png on 00000171.jpg → 641-incarnate_bg.jpg
[681/819] 641-therian.png on 00000087_(5).jpg → 641-therian_bg.jpg
[682/819] 642-incarnate.png on 00000057.jpg → 642-incarnate_bg.jpg
[683/819] 642-therian.png on 00000046_(2).jpg → 642-therian_bg.jpg
[684/819] 643.png on 00000070_(6).jpg → 643_bg.jpg
[685/819] 644.png on 00000203_(2).jpg → 644_bg.jpg
[686/819] 645-incarnate.png on 00000002.jpg → 645-incarnate_bg.jpg
[687/819] 645-therian.png on 00000291_(2).jpg → 645-therian_bg.jpg
[688/819] 646-black.png on 00000012_(4).jpg → 646-black_bg.jpg
[689/819] 646-white.png on 00000020_(2).jpg → 646-white_bg.jpg
[690/819] 646.png on 00000227_(2).jpg → 646_bg.jpg
[691/819] 647-ordinary.png on 00000297_(3).jpg → 647-ordinary_bg.jpg
[692/819] 647-resolute.png on 00000137.jpg → 647-resolute_bg.jpg
[693/819] 648-pirouette.png on 00000159_(2).jpg → 648-pirouette_bg.jpg
[694/819] 648.png on 00000085.jpg → 648_bg.jpg
[695/819] 649.png on 00000051.jpg → 649_bg.jpg
[696/819] 65-mega.png on 00000162_(2).jpg → 65-mega_bg.jpg
[697/819] 65.png on 00000154_(5).jpg → 65_bg.jpg
[698/819] 650.png on 00000072_(3).jpg → 650_bg.jpg
[699/819] 651.png on 00000049_(5).jpg → 651_bg.jpg
[700/819] 652.png on 00000234_(3).jpg → 652_bg.jpg
[701/819] 653.png on 00000079_(7).jpg → 653_bg.jpg
[702/819] 654.png on 00000271.jpg → 654_bg.jpg
[703/819] 655.png on 00000030_(7).jpg → 655_bg.jpg
[704/819] 656.png on 00000109_(6).jpg → 656_bg.jpg
[705/819] 657.png on 00000031_(5).jpg → 657_bg.jpg
[706/819] 658.png on 00000124_(5).jpg → 658_bg.jpg
[707/819] 659.png on 00000113_(4).jpg → 659_bg.jpg
[708/819] 66.png on 00000223.jpg → 66_bg.jpg
[709/819] 660.png on 00000064_(3).jpg → 660_bg.jpg
[710/819] 661.png on 00000292.jpg → 661_bg.jpg
[711/819] 662.png on 00000065_(5).jpg → 662_bg.jpg
[712/819] 663.png on 00000167.jpg → 663_bg.jpg
[713/819] 664.png on 00000242_(2).jpg → 664_bg.jpg
[714/819] 665.png on 00000078_(4).jpg → 665_bg.jpg
[715/819] 666-elegant.png on 00000183_(6).jpg → 666-elegant_bg.jpg
[716/819] 666.png on 00000236_(4).jpg → 666_bg.jpg
[717/819] 667.png on 00000184_(6).jpg → 667_bg.jpg
[718/819] 668.png on 00000022_(7).jpg → 668_bg.jpg
[719/819] 668f.png on 00000291_(2).jpg → 668f_bg.jpg
[720/819] 669.png on 00000258_(3).jpg → 669_bg.jpg
[721/819] 67.png on 00000137.jpg → 67_bg.jpg
[722/819] 670.png on 00000043_(3).jpg → 670_bg.jpg
[723/819] 671.png on 00000152_(2).jpg → 671_bg.jpg
[724/819] 672.png on 00000004_(2).jpg → 672_bg.jpg
[725/819] 673.png on 00000196_(4).jpg → 673_bg.jpg
[726/819] 674.png on 00000282_(4).jpg → 674_bg.jpg
[727/819] 675.png on 00000209.jpg → 675_bg.jpg
[728/819] 676-diamond.png on 00000089.jpg → 676-diamond_bg.jpg
[729/819] 676-heart.png on 00000227_(2).jpg → 676-heart_bg.jpg
[730/819] 676-star.png on 00000253_(3).jpg → 676-star_bg.jpg
[731/819] 676.png on 00000005_(6).jpg → 676_bg.jpg
[732/819] 677.png on 00000125_(3).jpg → 677_bg.jpg
[733/819] 678.png on 00000003_(5).jpg → 678_bg.jpg
[734/819] 678f.png on 00000224_(4).jpg → 678f_bg.jpg
[735/819] 679.png on 00000082_(3).jpg → 679_bg.jpg
[736/819] 68.png on 00000080_(3).jpg → 68_bg.jpg
[737/819] 680.png on 00000105_(4).jpg → 680_bg.jpg
[738/819] 681-blade.png on 00000220_(6).jpg → 681-blade_bg.jpg
[739/819] 681-shield.png on 00000158_(5).jpg → 681-shield_bg.jpg
[740/819] 681.png on 00000196_(2).jpg → 681_bg.jpg
[741/819] 682.png on 00000165_(5).jpg → 682_bg.jpg
[742/819] 683.png on 00000168_(2).jpg → 683_bg.jpg
[743/819] 684.png on 00000001_(7).jpg → 684_bg.jpg
[744/819] 685.png on 00000191_(6).jpg → 685_bg.jpg
[745/819] 686.png on 00000167_(2).jpg → 686_bg.jpg
[746/819] 687.png on 00000141_(3).jpg → 687_bg.jpg
[747/819] 688.png on 00000229_(5).jpg → 688_bg.jpg
[748/819] 689.png on 00000035_(3).jpg → 689_bg.jpg
[749/819] 69.png on 00000095_(3).jpg → 69_bg.jpg
[750/819] 690.png on 00000115_(4).jpg → 690_bg.jpg
[751/819] 691.png on 00000089_(6).jpg → 691_bg.jpg
[752/819] 692.png on 00000240_(4).jpg → 692_bg.jpg
[753/819] 693.png on 00000232_(6).jpg → 693_bg.jpg
[754/819] 694.png on 00000110_(5).jpg → 694_bg.jpg
[755/819] 695.png on 00000170_(5).jpg → 695_bg.jpg
[756/819] 696.png on 00000211_(6).jpg → 696_bg.jpg
[757/819] 697.png on 00000286_(3).jpg → 697_bg.jpg
[758/819] 698.png on 00000212_(4).jpg → 698_bg.jpg
[759/819] 699.png on 00000017_(3).jpg → 699_bg.jpg
[760/819] 7.png on 00000077.jpg → 7_bg.jpg
[761/819] 70.png on 00000131_(6).jpg → 70_bg.jpg
[762/819] 700.png on 00000236_(5).jpg → 700_bg.jpg
[763/819] 701.png on 00000210_(2).jpg → 701_bg.jpg
[764/819] 702.png on 00000143_(2).jpg → 702_bg.jpg
[765/819] 703.png on 00000052_(6).jpg → 703_bg.jpg
[766/819] 704.png on 00000158_(6).jpg → 704_bg.jpg
[767/819] 705.png on 00000188_(4).jpg → 705_bg.jpg
[768/819] 706.png on 00000199_(5).jpg → 706_bg.jpg
[769/819] 707.png on 00000279_(2).jpg → 707_bg.jpg
[770/819] 708.png on 00000255_(2).jpg → 708_bg.jpg
[771/819] 709.png on 00000095_(5).jpg → 709_bg.jpg
[772/819] 71.png on 00000102_(5).jpg → 71_bg.jpg
[773/819] 710.png on 00000286_(6).jpg → 710_bg.jpg
[774/819] 711.png on 00000295_(3).jpg → 711_bg.jpg
[775/819] 712.png on 00000013_(3).jpg → 712_bg.jpg
[776/819] 713.png on 00000026_(7).jpg → 713_bg.jpg
[777/819] 714.png on 00000016.jpg → 714_bg.jpg
[778/819] 715.png on 00000149.jpg → 715_bg.jpg
[779/819] 716.png on 00000003_(6).jpg → 716_bg.jpg
[780/819] 717.png on 00000203.jpg → 717_bg.jpg
[781/819] 718.png on 00000248.jpg → 718_bg.jpg
[782/819] 719-mega.png on 00000031_(4).jpg → 719-mega_bg.jpg
[783/819] 719.png on 00000053_(6).jpg → 719_bg.jpg
[784/819] 72.png on 00000235_(5).jpg → 72_bg.jpg
[785/819] 720-unbound.png on 00000049_(6).jpg → 720-unbound_bg.jpg
[786/819] 720.png on 00000155_(5).jpg → 720_bg.jpg
[787/819] 721.png on 00000128_(5).jpg → 721_bg.jpg
[788/819] 73.png on 00000132_(6).jpg → 73_bg.jpg
[789/819] 74.png on 00000222_(2).jpg → 74_bg.jpg
[790/819] 75.png on 00000033_(7).jpg → 75_bg.jpg
[791/819] 76.png on 00000014_(4).jpg → 76_bg.jpg
[792/819] 77.png on 00000113.jpg → 77_bg.jpg
[793/819] 78.png on 00000222_(5).jpg → 78_bg.jpg
[794/819] 79.png on 00000267_(2).jpg → 79_bg.jpg
[795/819] 8.png on 00000168_(2).jpg → 8_bg.jpg
[796/819] 80-mega.png on 00000287_(4).jpg → 80-mega_bg.jpg
[797/819] 80.png on 00000083_(2).jpg → 80_bg.jpg
[798/819] 81.png on 00000121_(7).jpg → 81_bg.jpg
[799/819] 82.png on 00000144_(2).jpg → 82_bg.jpg
[800/819] 83.png on 00000180_(6).jpg → 83_bg.jpg
[801/819] 84.png on 00000153_(3).jpg → 84_bg.jpg
[802/819] 85.png on 00000261_(4).jpg → 85_bg.jpg
[803/819] 86.png on 00000000_(7).jpg → 86_bg.jpg
[804/819] 87.png on 00000063_(4).jpg → 87_bg.jpg
[805/819] 88.png on 00000143.jpg → 88_bg.jpg
[806/819] 89.png on 00000134_(2).jpg → 89_bg.jpg
[807/819] 9-mega.png on 00000132_(2).jpg → 9-mega_bg.jpg
[808/819] 9.png on 00000018_(3).jpg → 9_bg.jpg
[809/819] 90.png on 00000266_(5).jpg → 90_bg.jpg
[810/819] 91.png on 00000124_(3).jpg → 91_bg.jpg
[811/819] 92.png on 00000079_(4).jpg → 92_bg.jpg
[812/819] 93.png on 00000272_(5).jpg → 93_bg.jpg
[813/819] 94-mega.png on 00000014_(2).jpg → 94-mega_bg.jpg
[814/819] 94.png on 00000259_(6).jpg → 94_bg.jpg
[815/819] 95.png on 00000137.jpg → 95_bg.jpg
[816/819] 96.png on 00000053.jpg → 96_bg.jpg
[817/819] 97.png on 00000282_(5).jpg → 97_bg.jpg
[818/819] 98.png on 00000064.jpg → 98_bg.jpg
[819/819] 99.png on 00000281_(6).jpg → 99_bg.jpg

Resizing Images¶

In [3]:
# File Directory holding all of the files for this project
INPUT_ROOT   = r""

# Specific folders holder the training and testing images
SPLITS = [
    "pokemon_train",
    "pokemon_test",
    "animals_train",
    "animals_test",
]
TARGET_SIZE = (224, 224)

# Ensures that all images are the same size so the model doesn't learn if it is a pokemon or not based on image size
def batch_resize_inplace():
    for split in SPLITS:
        dirpath = os.path.join(INPUT_ROOT, split)
        files = [f for f in os.listdir(dirpath)
                 if f.lower().endswith((".jpg", ".jpeg", ".png"))]
        print(f"Resizing {len(files)} images in {split}/ (in-place)...")

        for fname in files:
            path = os.path.join(dirpath, fname)
            with Image.open(path) as img:
                img = img.convert("RGB")
                img = img.resize(TARGET_SIZE, Image.LANCZOS)
                new_path = os.path.splitext(path)[0] + ".jpg"
                img.save(new_path, "JPEG", quality=90)
                if path.lower().endswith(".png"):
                    os.remove(path)

        print(f"  → Done {split}\n")

if __name__ == "__main__":
    batch_resize_inplace()
Resizing 655 images in pokemon_train/ (in-place)...
  → Done pokemon_train

Resizing 164 images in pokemon_test/ (in-place)...
  → Done pokemon_test

Resizing 655 images in animals_train/ (in-place)...
  → Done animals_train

Resizing 164 images in animals_test/ (in-place)...
  → Done animals_test

Binary MLPClassifier: Pokemon vs Non-Pokemon¶

In [ ]:
# Folder Directories
DATA_ROOT       = r"C:\Users\jacko\Desktop\DAT494\FinalProject"
POKE_TRAIN_DIR  = "pokemon_train"
ANIM_TRAIN_DIR  = "animals_train"
POKE_TEST_DIR   = "pokemon_test"
ANIM_TEST_DIR   = "animals_test"

# Lets the code know if there is an image that wasn't sized properly
IMG_SIZE = (224,224)
# Batch sizes
BATCH_SIZE = 256
# Number of layers to not overr or under fit the model
HIDDEN_LAYERS = [32,32,32]
# Ensure random state for repeatability
RANDOM_STATE = 42

# This function builds my feature matrix and target vectors and ensures image size
def load_and_flatten(folder, label):
    X, y, paths = [], [], []

    for fname in sorted(os.listdir(folder)):
        if not fname.lower().endswith((".jpg", ".jpeg", ".png")):
            continue
        path = os.path.join(folder, fname)
        img = Image.open(path).convert("RGB")
        
        if img.size != IMG_SIZE:
            raise ValueError(f"{path} is size {img.size}, expected  {IMG_SIZE}")
        
        arr = np.asarray(img, dtype=np.float32) / 255.0
        X.append(arr.ravel())
        y.append(label)
        paths.append(path)

    return np.vstack(X), np.array(y, dtype = np.int64), paths

# Assembles my full training datasets
x_poke_train, y_poke_train, _ = load_and_flatten(os.path.join(DATA_ROOT, POKE_TRAIN_DIR), 1)
x_anim_train, y_anim_train, _ = load_and_flatten(os.path.join(DATA_ROOT, ANIM_TRAIN_DIR), 0)
X_train = np.vstack([x_poke_train, x_anim_train])
y_train = np.concatenate([y_poke_train, y_anim_train])

# Assembles my full testing datasets
x_poke_test, y_poke_test, paths_poke_test = load_and_flatten(os.path.join(DATA_ROOT, POKE_TEST_DIR), 1)
x_anim_test, y_anim_test, paths_anim_test = load_and_flatten(os.path.join(DATA_ROOT, ANIM_TEST_DIR), 0)
X_test = np.vstack([x_poke_test, x_anim_test])
y_test = np.concatenate([y_poke_test, y_anim_test])
test_paths = paths_poke_test + paths_anim_test

# Shows the training and testing shapes to ensure it separated and counted correctly
print(f"Train: X = {X_train.shape}, y = {y_train.shape}")
print(f"Test: X = {X_test.shape}, y = {y_test.shape}")
print(f"Train samples: {X_train.shape[0]}, Test samples: {X_test.shape[0]}")

# Counts and captures max iterations, accuracy scores, and losses
max_iters = list(range(1, 11))
accuracies = []
loss = []

# Loop for running through 1-10 max iterations and grabbing 
for mi in max_iters:
    mlp_clf = MLPClassifier(
        hidden_layer_sizes = HIDDEN_LAYERS,
        activation = "relu",
        alpha = 0,
        max_iter = mi,
        batch_size = BATCH_SIZE,
        random_state = RANDOM_STATE,
        warm_start = False
    )

    # Fits the training set to the MLPClassifier
    print("Fitting MLPClassifier on binary labels...")
    mlp_clf.fit(X_train, y_train)

# Runs testing and outputs accuracy and loss
    y_pred = mlp_clf.predict(X_test)
    acc = accuracy_score(y_test, y_pred)
    accuracies.append(acc)
    loss.append(mlp_clf.loss_)
    cm = confusion_matrix(y_test, y_pred, labels = [0,1])
    print(f"max_iter = {mi:2d} -> Test Accuracy = {acc:.4f}, Loss = {mlp_clf.loss_:.4f}")
    print(f"Confusion Matrix: \n{cm}")

    

# Accuracy Graph
plt.figure(figsize = (8,4))
plt.plot(max_iters, accuracies, marker = 'o')
plt.title("Test Accuracy vs max_iter (MLPClassifier)")
plt.xlabel("max_iter")
plt.ylabel("Test Accuracy")
plt.xticks(max_iters)
plt.grid(True)
plt.show()

# Loss Graph
plt.figure(figsize = (8,4))
plt.plot(max_iters, loss, marker = 'o', color = 'red')
plt.title("Training Loss vs max_iter (MLPClassifier)")
plt.xlabel("max_iter")
plt.ylabel("Training Loss")
plt.xticks(max_iters)
plt.grid(True)
plt.show()
Train: X = (1310, 150528), y = (1310,)
Test: X = (328, 150528), y = (328,)
Train samples: 1310, Test samples: 328
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (1) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  1 -> Test Accuracy = 0.5000, Loss = 4.7938
Confusion Matrix: 
[[164   0]
 [164   0]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (2) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  2 -> Test Accuracy = 0.5701, Loss = 3.2660
Confusion Matrix: 
[[ 30 134]
 [  7 157]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (3) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  3 -> Test Accuracy = 0.6189, Loss = 0.6316
Confusion Matrix: 
[[156   8]
 [117  47]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (4) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  4 -> Test Accuracy = 0.7043, Loss = 0.5829
Confusion Matrix: 
[[ 90  74]
 [ 23 141]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (5) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  5 -> Test Accuracy = 0.7500, Loss = 0.9633
Confusion Matrix: 
[[135  29]
 [ 53 111]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (6) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  6 -> Test Accuracy = 0.5701, Loss = 0.7696
Confusion Matrix: 
[[ 26 138]
 [  3 161]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (7) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  7 -> Test Accuracy = 0.7713, Loss = 0.4121
Confusion Matrix: 
[[129  35]
 [ 40 124]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (8) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  8 -> Test Accuracy = 0.7683, Loss = 0.4361
Confusion Matrix: 
[[101  63]
 [ 13 151]]
Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (9) reached and the optimization hasn't converged yet.
  warnings.warn(
max_iter =  9 -> Test Accuracy = 0.7835, Loss = 0.6569
Confusion Matrix: 
[[138  26]
 [ 45 119]]
Fitting MLPClassifier on binary labels...
max_iter = 10 -> Test Accuracy = 0.7805, Loss = 0.4468
Confusion Matrix: 
[[132  32]
 [ 40 124]]
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (10) reached and the optimization hasn't converged yet.
  warnings.warn(
No description has been provided for this image
No description has been provided for this image
In [4]:
# Confusion Matrix

import seaborn as sns
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

# Step 2: Create the confusion matrix
cm = confusion_matrix(y_test, y_pred, labels=[0, 1])

# Step 3: Plot the confusion matrix using seaborn heatmap
plt.figure(figsize=(6, 5))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Animal', 'Pokémon'], yticklabels=['Animal', 'Pokémon'])
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.title("Confusion Matrix: Pokémon vs Animal Classifier")
plt.tight_layout()
plt.show()
No description has been provided for this image
In [5]:
# Identify the best hyperparameter setting based on validation accuracy
best_idx = int(np.argmax(accuracies))              # Index of best-performing model
best_iter = max_iters[best_idx]                    # Corresponding number of iterations
print(f"Best max_iter = {best_iter}, Test Accuracy = {accuracies[best_idx]:.4f}")

# Rebuild the classifier using the best number of iterations
best_clf = MLPClassifier(
    hidden_layer_sizes=HIDDEN_LAYERS,
    activation="relu",
    alpha=0,
    max_iter=best_iter,
    batch_size=BATCH_SIZE,
    random_state=RANDOM_STATE,
    warm_start=False
)

# Fit the best model to the full training set
best_clf.fit(X_train, y_train)

# Predict labels on the test set
y_pred_best = best_clf.predict(X_test)

# Categorize predictions for analysis and visualization
categories = {
    "True Positives (Pokemon -> Pokemon)": [
        (p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 1 and yp == 1
    ],
    "False Positives (Animal -> Pokemon)": [
        (p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 0 and yp == 1
    ],
    "False Negatives (Pokemon -> Animal)": [
        (p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 1 and yp == 0
    ],
    "True Negatives (Animal -> Animal)": [
        (p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 0 and yp == 0
    ],
}

# Function to display sample images from each category
# Inputs:
#   - title: category name (e.g., "True Positives")
#   - items: list of (image path, true label, predicted label)
#   - max_samples: number of images to show (default: 9)

def plot_samples(title, items, max_samples=9):
    n = min(len(items), max_samples)
    cols = 3
    rows = (n + cols - 1) // cols
    fig, axes = plt.subplots(rows, cols, figsize=(cols * 3, rows * 3))
    axes = axes.flatten()

    # Display each selected image with its labels
    for ax, (path, yt, yp) in zip(axes, items[:n]):
        img = Image.open(path).convert("RGB")
        ax.imshow(img)
        ax.set_title(f"true = {yt}, pred = {yp}")
        ax.axis("off")

    # Hide unused subplot axes
    for ax in axes[n:]:
        ax.axis("off")

    # Add overall title
    fig.suptitle(title, fontsize=14)
    plt.tight_layout()
    plt.show()

# Visualize predictions in each category (TP, FP, FN, TN)
for title, items in categories.items():
    plot_samples(title, items)
Best max_iter = 9, Test Accuracy = 0.7835
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (9) reached and the optimization hasn't converged yet.
  warnings.warn(
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [ ]: